/**
 * 商品管理控制器模块
 * 
 * 处理商品增删改查(CRUD)操作的业务逻辑
 */

const GoodsService = require('../services/goods.service');
const { Category, Goods } = require('../models');
const CustomError = require('../utils/customError');
const logger = require('../utils/logger');

/**
 * 获取商品列表
 * @param {import('express').Request} req 
 * @param {import('express').Response} res 
 */
async function getGoodsList(req, res) {
  const { page, limit} = req.params;
  const {category1Id, category2Id, tag } = req.query;

  logger.debug(`获取商品列表, page: ${page}, limit: ${limit}, category1Id: ${category1Id}, category2Id: ${category2Id}, tag: ${tag}`);

  const result = await GoodsService.getGoodsList(
    parseInt(page),
    parseInt(limit),
    category1Id ? parseInt(category1Id) : null,
    category2Id ? parseInt(category2Id) : null,
    tag
  );

  res.json({
    code: 200,
    message: "获取商品列表成功",
    data: result
  });
}

/**
 * 获取单个商品详情
 * @param {import('express').Request} req 
 * @param {import('express').Response} res 
 */
async function getGoodsById(req, res) {
  const id = req.params.id;

  logger.debug(`获取商品 ID: ${id}`);

  const goods = await GoodsService.getGoodsById(id);

  if (!goods) {
    throw new CustomError(404, '商品不存在');
  }

  res.json({
    code: 200,
    message: "获取商品详情成功",
    data: goods.toJSON ? goods.toJSON() : goods
  });
}

/**
 * 创建商品
 * @param {import('express').Request} req 
 * @param {import('express').Response} res 
 */
async function createGoods(req, res) {
  const goodsData = req.body;

  logger.debug('创建商品', goodsData);

  // 业务逻辑校验
  // 1. 商品名称不能为空且长度限制
  if (!goodsData.name || goodsData.name.trim().length === 0) {
    throw new CustomError(400, '商品名称不能为空');
  }
  if (goodsData.name.length > 100) {
    throw new CustomError(400, '商品名称不能超过100个字符');
  }

  // 2. 商品价格必须大于等于0
  if (goodsData.price === undefined || goodsData.price < 0) {
    throw new CustomError(400, '商品价格必须大于等于0');
  }

  // 3. 商品库存必须大于等于0
  if (goodsData.stock === undefined || goodsData.stock < 0) {
    throw new CustomError(400, '商品库存必须大于等于0');
  }

  // 4. 商品分类ID必须存在且有效
  if (!goodsData.categoryId) {
    throw new CustomError(400, '商品分类ID不能为空');
  }
  // 检查分类是否存在
  const category = await Category.findByPk(goodsData.categoryId);
  if (!category) {
    throw new CustomError(400, '无效的商品分类ID');
  }

  // 6. 商品图片URL不能为空
  if (goodsData.images && Array.isArray(goodsData.images)) {
    for (const img of goodsData.images) {
      if (!img.imageUrl || img.imageUrl.trim().length === 0) {
        throw new CustomError(400, '商品图片URL不能为空');
      }
    }
  }

  // 7. 商品标签必须是数组格式
  if (goodsData.tags && !Array.isArray(goodsData.tags)) {
    throw new CustomError(400, '商品标签必须是数组格式');
  }

  const goods = await GoodsService.createGoods(goodsData);

  res.status(200).json({
    code: 201,
    message: "创建商品成功",
    data: goods.toJSON ? goods.toJSON() : goods
  });
}

/**
 * 更新商品
 * @param {import('express').Request} req 
 * @param {import('express').Response} res 
 */
async function updateGoods(req, res) {
  const id = req.params.id;
  const goodsData = req.body;

  logger.debug(`更新商品 ID: ${id}`, goodsData);

  // 业务逻辑校验 - 只校验被提供的字段
  // 1. 检查商品是否存在
  const existingGoods = await Goods.findByPk(id);
  if (!existingGoods) {
    throw new CustomError(404, '商品不存在');
  }

  // 2. 商品名称长度限制（如果提供了）
  if (goodsData.name !== undefined) {
    if (goodsData.name.trim().length === 0) {
      throw new CustomError(400, '商品名称不能为空');
    }
    if (goodsData.name.length > 100) {
      throw new CustomError(400, '商品名称不能超过100个字符');
    }
  }

  // 3. 商品价格必须大于等于0（如果提供了）
  if (goodsData.price !== undefined && goodsData.price < 0) {
    throw new CustomError(400, '商品价格必须大于等于0');
  }

  // 4. 商品库存必须大于等于0（如果提供了）
  if (goodsData.stock !== undefined && goodsData.stock < 0) {
    throw new CustomError(400, '商品库存必须大于等于0');
  }

  // 5. 商品分类ID必须存在且有效（如果提供了）
  if (goodsData.categoryId !== undefined) {
    // 检查分类是否存在
    const category = await Category.findByPk(goodsData.categoryId);
    if (!category) {
      throw new CustomError(400, '无效的商品分类ID');
    }
  }

  // 7. 商品图片URL不能为空（如果提供了图片）
  if (goodsData.images && Array.isArray(goodsData.images)) {
    for (const img of goodsData.images) {
      if (!img.imageUrl || img.imageUrl.trim().length === 0) {
        throw new CustomError(400, '商品图片URL不能为空');
      }
    }
  }

  // 8. 商品标签必须是数组格式（如果提供了）
  if (goodsData.tags !== undefined && !Array.isArray(goodsData.tags)) {
    throw new CustomError(400, '商品标签必须是数组格式');
  }

  const goods = await GoodsService.updateGoods(id, goodsData);

  if (!goods) {
    throw new CustomError(404, '商品不存在');
  }

  res.json({
    code: 200,
    message: "更新商品成功",
    data: goods.toJSON ? goods.toJSON() : goods
  });
}

/**
 * 删除商品
 * @param {import('express').Request} req 
 * @param {import('express').Response} res 
 */
async function deleteGoods(req, res) {
  const id = parseInt(req.params.id);

  logger.debug(`删除商品 ID: ${id}`);

  const result = await GoodsService.deleteGoods(id);

  if (!result) {
    throw new CustomError(404, '商品不存在');
  }

  res.json({
    code: 200,
    message: "删除商品成功",
    data: null
  });
}

/**
 * 获取推荐商品
 * @param {import('express').Request} req 
 * @param {import('express').Response} res 
 */
async function getRecommendedGoods(req, res) {
  const { limit = 10 } = req.query;

  logger.debug(`获取推荐商品, limit: ${limit}`);

  const goods = await GoodsService.getRecommendedGoods(parseInt(limit));

  res.json({
    code: 200,
    message: "获取推荐商品成功",
    data: goods.map(item => item.toJSON ? item.toJSON() : item)
  });
}

/**
 * 获取猜你喜欢商品
 * @param {import('express').Request} req 
 * @param {import('express').Response} res 
 */
async function getGuessLikeGoods(req, res) {
  const { limit = 10 } = req.query;

  logger.debug(`获取猜你喜欢商品, limit: ${limit}`);

  const goods = await GoodsService.getGuessLikeGoods(parseInt(limit));

  res.json({
    code: 200,
    message: "获取猜你喜欢商品成功",
    data: goods.map(item => item.toJSON ? item.toJSON() : item)
  });
}

/**
 * 获取所有标签
 * @param {import('express').Request} req 
 * @param {import('express').Response} res 
 */
async function getAllTags(req, res) {
  logger.debug('获取所有标签');

  const tags = await GoodsService.getAllTags();

  res.json({
    code: 200,
    message: "获取标签列表成功",
    data: tags
  });
}

module.exports = {
  getGoodsList,
  getGoodsById,
  createGoods,
  updateGoods,
  deleteGoods,
  getRecommendedGoods,
  getGuessLikeGoods,
  getAllTags
};